﻿using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using Zimmerreservierung.Model;

namespace Zimmerreservierung.Controller
{
    public class ZimmerController
    {
        private static ZimmerController instance;
        private SQLiteConnection connection;

        public ZimmerController()
        {
            connection = new SQLiteConnection(Properties.Settings.Default.dbConnectionString);
        }

        public static ZimmerController getInstance()
        {
            if (instance == null)
                instance = new ZimmerController();

            return instance;
        }

        public List<Zimmer> GetZimmeren()
        {
            List<Zimmer> Zimmeren = new List<Zimmer>();
            const string sql = "SELECT * FROM Zimmer order by Name";

            try
            {
                connection.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(connection))
                {
                    cmd.CommandText = sql;

                    SQLiteDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        Zimmer zimmer = new Zimmer
                        {
                            Id = Convert.ToInt32(reader["ID"]),
                            Name = Convert.ToString(reader["Name"]),
                            Belegzahl = Convert.ToInt32(reader["MaxBelegzahl"]),
                            Erwachsener = Convert.ToDouble(reader["PreisEZ"]),
                            ZweiErwachsene = Convert.ToDouble(reader["PreisDZ"]),
                            DreiErwachsene = Convert.ToDouble(reader["PreisDreifachZ"]),
                            ErwachsenerKind = Convert.ToDouble(reader["PreisEZmitKind"]),
                            ErwachsenerZweiKinder = Convert.ToDouble(reader["PreisEZmit2Kind"]),
                            ZweiErwachseneKind = Convert.ToDouble(reader["PreisDZmitKind"])
                        };

                        Zimmeren.Add(zimmer);
                    }
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                connection.Close();
            }

            return Zimmeren;
        }

        public Zimmer GetZimmer(int id)
        {
            Zimmer zimmer = null;
            string sql = "SELECT * FROM Zimmer where ID = '" + id + "'";

            try
            {
                connection.Open();
                using (SQLiteCommand cmd = new SQLiteCommand(connection))
                {
                    cmd.CommandText = sql;

                    SQLiteDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        zimmer = new Zimmer
                        {
                            Id = Convert.ToInt32(reader["ID"]),
                            Name = Convert.ToString(reader["Name"]),
                            Belegzahl = Convert.ToInt32(reader["MaxBelegzahl"]),
                            Erwachsener = Convert.ToDouble(reader["PreisEZ"]),
                            ZweiErwachsene = Convert.ToDouble(reader["PreisDZ"]),
                            DreiErwachsene = Convert.ToDouble(reader["PreisDreifachZ"]),
                            ErwachsenerKind = Convert.ToDouble(reader["PreisEZmitKind"]),
                            ErwachsenerZweiKinder = Convert.ToDouble(reader["PreisEZmit2Kind"]),
                            ZweiErwachseneKind = Convert.ToDouble(reader["PreisDZmitKind"])
                        };
                    }
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                connection.Close();
            }
            return zimmer;
        }

        public bool StoreZimmer(string name, int belegzahl, double erw, double _2erw, double _3erw, double erwKind, double erw2kind, double _2erwKind)
        {
            int actionOK = 0;

            try
            {
                connection.Open();
                using (SQLiteCommand command = new SQLiteCommand(connection))
                {
                    command.CommandText = string.Format("INSERT INTO Zimmer (ID, Name, MaxBelegzahl, PreisEZ, PreisDZ, PreisDreifachZ, PreisEZmitKind, PreisEZmit2Kind, PreisDZmitKind ) "
                                                + "VALUES (NULL, '{0}', {1}, '{2}', '{3}', '{4}', '{5}', '{6}', '{7}' );", name, belegzahl, erw, _2erw, _3erw, erwKind, erw2kind, _2erwKind);
                    actionOK = command.ExecuteNonQuery();
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                connection.Close();
            }

            return actionOK == 1 ? true : false;
        }

        public bool UpdateZimmer(int id, string name, int belegzahl, double erw, double _2erw, double _3erw, double erwKind, double erw2kind, double _2erwKind)
        {
            int actionOK = 0;

            try
            {
                connection.Open();
                using (SQLiteCommand command = new SQLiteCommand(connection))
                {
                    command.CommandText = string.Format("UPDATE Zimmer SET Name='{0}', MaxBelegzahl = {1}, PreisEZ='{2}', PreisDZ='{3}',"
                                                        + " PreisDreifachZ='{4}', PreisEZmitKind='{5}', PreisEZmit2Kind='{6}',"
                                                        + " PreisDZmitKind='{7}' "
                                                        + "WHERE ID = {8};", name, belegzahl, erw, _2erw, _3erw, erwKind, erw2kind, _2erwKind, id);
                    actionOK = command.ExecuteNonQuery();
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                connection.Close();
            }

            return actionOK == 1 ? true : false;
        }

        public bool RemoveZimmer(int id)
        {
            int actionOK = 0;

            try
            {
                connection.Open();
                using (SQLiteCommand command = new SQLiteCommand(connection))
                {
                    command.CommandText = "DELETE FROM Zimmer WHERE ID = " + id;
                    actionOK = command.ExecuteNonQuery();
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                connection.Close();
            }

            return actionOK == 1 ? true : false;
        }

        public List<Kosten> GetZimmerKosten(int id)
        {
            Zimmer zimmer = GetZimmer(id);

            List<Kosten> kosten = new List<Kosten>();

            if (zimmer.Erwachsener > 0 && zimmer.Belegzahl >= 1)
                kosten.Add(new Kosten { Betrag = zimmer.Erwachsener, Bezeichnung = "1 EW" });

            if (zimmer.ZweiErwachsene > 0 && zimmer.Belegzahl >= 2)
                kosten.Add(new Kosten { Betrag = zimmer.ZweiErwachsene, Bezeichnung = "2 EW" });

            if (zimmer.DreiErwachsene > 0 && zimmer.Belegzahl >= 3)
                kosten.Add(new Kosten { Betrag = zimmer.DreiErwachsene, Bezeichnung = "3 EW" });

            if (zimmer.ErwachsenerKind > 0 && zimmer.Belegzahl >= 2)
                kosten.Add(new Kosten { Betrag = zimmer.ErwachsenerKind, Bezeichnung = "1 EW+K" });

            if (zimmer.ErwachsenerZweiKinder > 0 && zimmer.Belegzahl >= 3)
                kosten.Add(new Kosten { Betrag = zimmer.ErwachsenerZweiKinder, Bezeichnung = "1 EW+2K" });

            if (zimmer.ZweiErwachseneKind > 0 && zimmer.Belegzahl >= 3)
                kosten.Add(new Kosten { Betrag = zimmer.ZweiErwachseneKind, Bezeichnung = "2 EW+K" });

            return kosten;
        }

        public void startConnection(String connectionString)
        {
            connection.Close();
            connection = new SQLiteConnection(connectionString);
        }
    }
}
